package locadora.model;

import java.util.Collection;
import java.util.LinkedList;

/**
 * Classe que representa um Cliente de uma Locadora
 * @author Leonardo Rocha Dias
 * @author Marccelo Augusto Selvaggio
 * @version 9.11-07
 * @since 2009
 */
public class Cliente {

    // TODO devo implementar tratamento para não permitir nome em branco ?
    // TODO devo implementar tratamento para não permitir nome com menos de x caracteres ?

    // <editor-fold defaultstate="collapsed" desc=" Atributos ">
    private String nome;
    private String codigo;
    private LinkedList<ItemLocacao> itensLocacao;
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc=" Construtor ">
    /**
     * Construtor
     * @param nome, o nome do cliente
     * @param codigo, o codigo do cliente
     */
    public Cliente(String nome, String codigo){
        this.nome = nome;
        this.codigo = codigo;
        /**
         * Uma fila é simplesmente uma linha de espera que cresce somando
         * elementos ao seu final e que diminui tomando elementos de sua frente.
         * Em uma extremidade os nós são somente adicionados, e na outra os nós
         * são somente removidos.
         * As filas são importantes pois elas determinam a ordem de atendimento das pessoas
         *
         * As pessoas são atendidas conforme a posição delas na fila.
         * O próximo a ser atendido é o primeiro da fila.
         * Quando o primeiro da fila é chamado para ser atendido a fila “anda”,
         * ou seja, o segundo passa a ser o primeiro, o terceiro passa a ser o
         * segundo e assim por diante até a última pessoa.
         * Normalmente, para entar em uma fila, uma pessoa deve se colocar na
         * última posição, ou seja, no fim da fila.
         * Desta forma, quem chega primeiro tem prioridade.
         *
         */
        this.itensLocacao = new LinkedList<ItemLocacao>();
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc=" Propriedades ">
    /**
     * Recupera, pega, obtem o nome do cliente
     * @return o nome do cliente
     */
    public String getNome() {
        return nome;
    }

    /**
     * Define o nome do cliente
     * @param nome, o nome a ser definido
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * Recupera, pega, obtem o código do cliente
     * @return o codigo do cliente
     */
    public String getCodigo() {
        return codigo;
    }

    /**
     * Define o código do cliente
     * @param codigo, o codigo a ser definido
     */
    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    /**
     * Recupera, pega, obtem a coleção de itens do cliente
     * @return a coleção de itens do cliente
     */
    public Collection<ItemLocacao> getItensLocacao() {
        return itensLocacao;
    }

    /**
     * Define a coleção de itens para locação do cliente
     * @param itensLocacao, a coleção de itens
     */
    public void setItensLocacao(Collection<ItemLocacao> itensLocacao) {
        this.itensLocacao = (LinkedList<ItemLocacao>) itensLocacao;
    }
    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc=" Métodos ">
    /**
     * Devolve se o um cliente é igual a outro com base no código do cliente
     * @param obj que representa um cliente
     * @return verdadeiro se o código deste cliente for igual ao do cliente
     * recebido por parâmetro ou falso caso contrário, ou seja, se os códigos não
     * forem iguais
     */
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Cliente other = (Cliente) obj;
        if ((this.codigo == null) ? (other.codigo != null) : !this.codigo.equals(other.codigo)) {
            return false;
        }
        return true;
    }

    /**
     * Gera o codigo hash com base no código do cliente
     * utilizado para identificação em conjuntos
     * @return o codigo hash
     */
    @Override
    public int hashCode() {
        int hash = 5;
        hash = 97 * hash + (this.codigo != null ? this.codigo.hashCode() : 0);
        return hash;
    }

    /**
     * Representa a string do objeto Cliente
     * @return uma string contendo o nome e código do cliente
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        String separadorLinha = System.getProperty("line.separator");

        sb.append(this.getClass().getSimpleName());
        sb.append(separadorLinha);

        sb.append("Código: ");
        sb.append(this.codigo);

        sb.append(separadorLinha);

        sb.append("Nome: ");
        sb.append(this.nome);

        sb.append(separadorLinha);

        return sb.toString();
    }
    // </editor-fold>

    public ItemLocacao getItemPrioridade() {
        return itensLocacao.get(itensLocacao.size() - 1);
    }

}
